// Copyright 2021 Tencent Inc. All rights reserved.
//
// 商家转账对外API（2025年1月15日升级版本）
//
// 发起转账
// [https://pay.weixin.qq.com/doc/v3/merchant/4012716434](https://pay.weixin.qq.com/doc/v3/merchant/4012716434)
// 商家转账用户确认模式下，用户申请收款时，商户可通过此接口申请创建转账单
// 接口返回的HTTP状态码及错误码，仅代表本次请求的结果，不能代表订单状态。
// 接口返回的HTTP状态码为200，且状态为WAIT_USER_CONFIRM时，可认为创建转账单成功，可引导用户确认收款。其余状态请参考开发指引中的状态机描述进行处理。
// 接口返回的HTTP状态码不为200时，请商户务必不要立即更换商户订单号重试。可根据错误码列表中的描述和接口返回的信息进行处理，并在查询原订单结果为失败或者联系客服确认情况后，再更换商户订单号进行重试。否则会有重复转账的资金风险。
// 注：单个商户的接口频率限制为100次/s
//
// API version: 1.0.0

// Code generated by WechatPay APIv3 Generator based on [OpenAPI
// Generator](https://openapi-generator.tech); DO NOT EDIT.

package com.wechat.pay.java.service.mchtransfer.model;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;
import java.util.function.UnaryOperator;

import static com.wechat.pay.java.core.util.StringUtil.toIndentedString;

/** TransferSceneReportInfo */
public class TransferSceneReportInfo {
    /** 信息类型 string[1,15] 必填 */
    @SerializedName("info_type")
    private String infoType;

    /** 信息内容 string[1,32] 必填 */
    @SerializedName("info_content")
    private String infoContent;

    public TransferSceneReportInfo() {}

    public TransferSceneReportInfo(String infoType, String infoContent) {
        this.infoType = infoType;
        this.infoContent = infoContent;
    }

    public String getInfoType() {
        return infoType;
    }

    public TransferSceneReportInfo setInfoType(String infoType) {
        this.infoType = infoType;
        return this;
    }

    public String getInfoContent() {
        return infoContent;
    }

    public TransferSceneReportInfo setInfoContent(String infoContent) {
        this.infoContent = infoContent;
        return this;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class TransferSceneReportInfo {\n");
        sb.append("    infoType: ").append(toIndentedString(infoType)).append("\n");
        sb.append("    infoContent: ").append(toIndentedString(infoContent)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    public TransferSceneReportInfo cloneWithCipher(UnaryOperator<String> s) {
        TransferSceneReportInfo copy = new TransferSceneReportInfo();
        copy.infoType = infoType;
        copy.infoContent = infoContent;
        return copy;
    }

    /**
     * 构建现金营销转账场景报备信息
     *
     * @param activityName 活动名称，示例：新会员有礼
     * @param rewardDescription 奖励说明，示例：注册会员抽奖一等奖
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildCashMarketing(
            String activityName, String rewardDescription) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("活动名称", activityName));
        list.add(new TransferSceneReportInfo("奖励说明", rewardDescription));
        return list;
    }

    /**
     * 构建企业赔付转账场景报备信息
     *
     * @param compensationReason 赔付原因，示例：商品质量问题退款
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildEnterpriseCompensation(
            String compensationReason) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("赔付原因", compensationReason));
        return list;
    }

    /**
     * 构建佣金报酬转账场景报备信息
     *
     * @param positionType 岗位类型，示例：外卖员
     * @param compensationDescription 报酬描述，示例：7月份配送费
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildCommissionCompensation(
            String positionType, String compensationDescription) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("岗位类型", positionType));
        list.add(new TransferSceneReportInfo("报酬说明", compensationDescription));
        return list;
    }

    /**
     * 构建采购贷款转账场景报备信息
     *
     * @param goodsName 采购商品名称，示例：戴尔笔记本电脑
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildProcurementLoan(String goodsName) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("采购商品名称", goodsName));
        return list;
    }

    /**
     * 构建二手回收转账场景报备信息
     *
     * @param goodsName 回收商品名称，示例：塑料瓶
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildSecondHandRecycling(String goodsName) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("回收商品名称", goodsName));
        return list;
    }

    /**
     * 构建公益补助转账场景报备信息
     *
     * @param activityName 公益活动名称，在民政部的备案名称
     * @param recordNumber 公益活动备案编号，在民政部的备案编号
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildPublicWelfareSubsidy(
            String activityName, String recordNumber) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("公益活动名称", activityName));
        list.add(new TransferSceneReportInfo("公益活动备案编号", recordNumber));
        return list;
    }

    /**
     * 构建行政补贴转账场景报备信息
     *
     * @param subsidyType 补贴类型，示例：购车补贴
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildAdministrativeSubsidy(String subsidyType) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("补贴类型", subsidyType));
        return list;
    }

    /**
     * 构建保险理赔转账场景报备信息
     *
     * @param recordNumber 保险产品备案编号，示例：01212121212
     * @param insuranceName 保险名称，示例：意外险
     * @param operationNumber 保险操作单号，示例：12121245442
     * @return 转账场景报备信息
     */
    public static List<TransferSceneReportInfo> buildInsuranceClaim(
            String recordNumber, String insuranceName, String operationNumber) {
        List<TransferSceneReportInfo> list = new ArrayList<>();
        list.add(new TransferSceneReportInfo("保险产品备案编号", recordNumber));
        list.add(new TransferSceneReportInfo("保险名称", insuranceName));
        list.add(new TransferSceneReportInfo("保险操作单号", operationNumber));
        return list;
    }
}